﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Tesis.Models;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Collections;

namespace Tesis.Areas.Distribuciones.Models
{
    public class Parametro : DBable 
    {
        [DisplayName("Nombre de la variable")]
        public string Nombre { get; set; }

        public virtual Tipo Tipo { get; set; }

        [DisplayName("Valor Inicial")]
        public double Valor { get; set; }

        [DisplayName("Descripción")]
        public string Descripcion { get; set; }
    }

    //public class Parametro : DBable, IEquatable<Parametro>
    //{
    //    [DisplayName("Nombre de la variable")]
    //    public string Nombre { get; set; }

    //    public virtual Tipo Tipo { get; set; }

    //    [DisplayName("Valor Inicial")]
    //    public double Valor { get; set; }

    //    [DisplayName("Descripción")]
    //    public string Descripcion { get; set; }

    //    public Parametro(string Nombre, Tipo Tipo, double Valor, string Descripcion )
    //    {
    //        this.Nombre = Nombre;
    //        this.Tipo = Tipo;
    //        this.Valor = Valor;
    //        this.Descripcion = Descripcion;    
    //    }

    //    public bool Equals(Parametro otro)
    //    {
    //        if (new MismoParametro().Equals(this, otro))
    //        {
    //            return true;
    //        }
    //        else
    //        {
    //            return false;
    //        }
    //    }

    //    public override bool Equals(object obj)
    //    {
    //        return base.Equals(obj);
    //    }

    //    //[DisplayName("Numero de Pruebas Realizadas (N)")]
    //    //[Required]
    //    //public int N { get; set; }

    //    //[DisplayName("Probabilidad de Exito (p)")]
    //    //[Required]
    //    //public double P { get; set; }

    //    //[DisplayName("Probabilidad de Fracaso (q)")]
    //    //public double Q { get; set; }

    //    //[DisplayName("Valor Esperado")]
    //    //public double E { get; set; }

    //    //[DisplayName("Varianza")]
    //    //public double V { get; set; }
    //}

    //public class ParametroCollection : ICollection<Parametro>
    //{

    //    // The generic enumerator obtained from IEnumerator<Parametro>
    //    // by GetEnumerator can also be used with the non-generic IEnumerator.
    //    // To avoid a naming conflict, the non-generic IEnumerable method
    //    // is explicitly implemented.

    //    public IEnumerator<Parametro> GetEnumerator()
    //    {
    //        return new ParametroEnumerator(this);
    //    }

    //    IEnumerator IEnumerable.GetEnumerator()
    //    {
    //        return new ParametroEnumerator(this);
    //    }

    //    // The inner collection to store objects.
    //    private List<Parametro> innerCol;
    //    // For IsReadOnly
    //    private bool isRO = false;

    //    public ParametroCollection()
    //    {
    //        innerCol = new List<Parametro>();
    //    }

    //    // Adds an index to the collection.
    //    public Parametro this[int index]
    //    {
    //        get { return (Parametro)innerCol[index]; }
    //        set { innerCol[index] = value; }
    //    }

    //    // Determines if an item is in the collection
    //    // by using the BoxSameDimensions equality comparer.
    //    public bool Contains(Parametro item)
    //    {
    //        bool found = false;

    //        foreach (Parametro pr in innerCol)
    //        {
    //            // Equality defined by the Box
    //            // class's implmentation of IEquitable<T>.
    //            if (pr.Equals(item))
    //            {
    //                found = true;
    //            }
    //        }

    //        return found;
    //    }

    //    // Determines if an item is in the 
    //    // collection by using a specified equality comparer.
    //    public bool Contains(Parametro item, EqualityComparer<Parametro> comp)
    //    {
    //        bool found = false;

    //        foreach (Parametro pr in innerCol)
    //        {
    //            if (comp.Equals(pr, item))
    //            {
    //                found = true;
    //            }
    //        }

    //        return found;
    //    }

    //    // Adds an item if it is not already in the collection
    //    // as determined by calling the Contains method.
    //    public void Add(Parametro item)
    //    {
    //        if (!Contains(item))
    //        {
    //            innerCol.Add(item);
    //        }
    //        else
    //        {
    //            //ya esta dentro
    //        }
    //    }

    //    public void Clear()
    //    {
    //        innerCol.Clear();
    //    }

    //    public void CopyTo(Parametro[] array, int arrayIndex)
    //    {
    //        for (int i = 0; i < innerCol.Count; i++)
    //        {
    //            array[i] = (Parametro)innerCol[i];
    //        }
    //    }

    //    public int Count
    //    {
    //        get
    //        {
    //            return innerCol.Count;
    //        }
    //    }

    //    public bool IsReadOnly
    //    {
    //        get { return isRO; }
    //    }

    //    public bool Remove(Parametro item)
    //    {
    //        bool result = false;

    //        // Iterate the inner collection to 
    //        // find the box to be removed.
    //        for (int i = 0; i < innerCol.Count; i++)
    //        {

    //            Parametro curPar = (Parametro)innerCol[i];

    //            if (new MismoParametro().Equals(curPar, item))
    //            {
    //                innerCol.RemoveAt(i);
    //                result = true;
    //                break;
    //            }
    //        }
    //        return result;
    //    }
    //}

    //public class ParametroEnumerator : IEnumerator<Parametro>
    //{
    //    private ParametroCollection _collection;
    //    private int curIndex;
    //    private Parametro curParametro;

    //    public ParametroEnumerator(ParametroCollection collection)
    //    {
    //        _collection = collection;
    //        curIndex = -1;
    //        curParametro = default(Parametro);
    //    }

    //    public bool MoveNext()
    //    {
    //        //Avoids going beyond the end of the collection.
    //        if (++curIndex >= _collection.Count)
    //        {
    //            return false;
    //        }
    //        else
    //        {
    //            // Set current box to next item in collection.
    //            curParametro= _collection[curIndex];
    //        }
    //        return true;
    //    }

    //    public void Reset() { curIndex = -1; }

    //    void IDisposable.Dispose() { }

    //    public Parametro Current
    //    {
    //        get { return curParametro; }
    //    }


    //    object IEnumerator.Current
    //    {
    //        get { return Current; }
    //    }

    //}

    //public class MismoParametro : EqualityComparer<Parametro>
    //{
    //    public override bool Equals(Parametro pr1, Parametro pr2)
    //    {
    //        if (
    //            pr1.Descripcion.Replace(" ", "") == pr2.Descripcion.Replace(" ", "") &&
    //            pr1.Nombre.Replace(" ", "") == pr2.Nombre.Replace(" ", "") &&
    //            pr1.Tipo.Equals(pr2.Tipo)
    //            )
    //        {
    //            return true;
    //        }
    //        else
    //        {
    //            return false;
    //        }
    //    }
    //}
    
}

